package org.ko.core.websupport.log;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * <b>对Controller 中的方法进行log记录</b> <br />
 * message 是要记录的内容，可以使用{0},{1},{2}...这样的占位符 <br />
 * 当使用占位符时，params 应该与占位符相对应，如： <br />
 * message=查看了文章，id={0} <br />
 * params={"id"} <br />
 *  <br />
 * 则{0}会被替换成request.getParameter("id"); <br />
 * 
 * <hr />
 * 
 * 针对额外的日志信息，可以赋值到Request中：req.setAttribute(LogInfo.REMARK, "这里的信息会被记录到LogInfo中的remark字段");
 * 
 * <br />
 * Log
 * @date 2014-8-26
 * @version 1.0.0
 */
@Documented
@Target({METHOD})
@Retention(RUNTIME)
public @interface Log {	
	/**
	 * 系统日志
	 */
	public static final String SYSTEM = "SYSTEM";
	/**
	 * 用户相关日志
	 */
	public static final String USER = "USER";
	/**
	 * 菜单项目的日志
	 */
	public static final String MENU = "MENU";
	/**
	 * 菜单项目的日志
	 */
	public static final String BRAND = "BRAND";
	/**
	 * 角色相关日志
	 */
	public static final String ROLE = "ROLE";
	/**
	 * 权限相关日志
	 */
	public static final String PERMISSION = "PERMISSION";
	public static final String LOG = "LOG";
	
	/**
	 * 
	 * 日志信息
	 * @return
	 */
	String message();
	
	String[] params() default {};
	
	String category() default "";
	
	/**
	 * 
	 * 日志记录等级
	 * @return
	 */
	LogLevel level() default LogLevel.TRACE;
	
	/**
	 * 
	 * 是否覆盖包日志等级
	 * 1.为true不会参考level属性，直接写入日志。
	 * 2.为false会参考level属性。
	 * @return
	 */
	boolean override() default false;
}